home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
rename
< prev
next >
Wrap
Text File
|
2006-10-19
|
15KB
|
649 lines
************************************************************
* *
* GPL routine >23 - File/subdir rename *
* *
* Inputs: *
* >834C - SCSI device number and buffer bit *
* >834E - Pointer to new name *
* >8350 - Pointer to old name *
* *
* Outputs: *
* >8350 - Error code *
* Errors returned *
* Old file does not exist - 7 file error *
* Old file is protected - 1 *
* Another file with new name already exists - 7 *
* *
* Modifications: *
* Feb 28, 1997 - Had to completely rewrite routine *
* because it was taking too much space in memory *
* *
************************************************************
RENAM0 ANDI R12,>FF00
AI R12,24
* Lets start off by copying the old name and new name
* to a buffer in the SCSI card memory
*
LI R2,10
LI R3,RNOLD
LDCR @B02,4
MOVB @>834C,R0 See if filename is in CPU or VDP RAM
ANDI R0,>8000
JEQ RENAM3
MOV @>8350,R4 Get pointer to old name in CPU memory
RENAM1 MOVB *R4+,*R3+
DEC R2
JNE RENAM1
MOV @>834E,R4 Get pointer to new name in CPU memory
LI R3,RNNEW
LI R2,10
RENAM2 MOVB *R4+,*R3+
DEC R2
JNE RENAM1
JMP RENAM6
RENAM3 MOV @>8350,R4 Get pointer to old name in VDP memory
SWPB R4 Set VDP read address
MOVB R4,@VDPWA
SWPB R4
MOVB R4,@VDPWA
NOP
RENAM4 MOVB @VDPRD,*R3+
DEC R2
JNE RENAM4
MOVB @>834F,@VDPWA
NOP
MOVB @>834E,@VDPWA
LI R3,RNNEW
LI R2,10
RENAM5 MOVB @VDPRD,*R3+
DEC R2
JNE RENAM5
RENAM6
* Now we check to see if the parent directory exists
*
BL @MAKEFN
BL @GETDDR
CI R5,0 Check that directory exists
JNE RENM7
MOVB @B07,@>8350 Set error code
LDCR @ZERO,4
B @DSRRT
RENM7 LDCR @B03,4
MOVB @22(R5),R1 Get # of files in directory
JEQ RENM20
* Read the FDIR from disk
*
MOV @24(R5),R7 Get AU of FDIR
LDCR @B02,4
MOV R7,@RNFDIR Save AU of FDIR for later
LDCR @B04,4
MOV R6,R3
SRL R3,8
SLA R3,1
MPY @SAUTBL(R3),R7
LI R5,SECBUF
SRL R8,1
JNC RENM8
AI R5,>100
RENM8 SRL R7,1
JNC RENM9
ORI R8,>8000
RENM9 LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JEQ RENM10
RENM9A MOVB @B06,@>8350 Hardware error
B @DSRRT
RENM10 LI R2,DFDR Copy the FDIR to the DFDR
LI R3,256 buffer
RENM11 LDCR @ZERO,4
MOV *R5+,R4
LDCR @B02,4
MOV R4,*R2+
DECT R3
JNE RENM11
LI R2,>0200 R2 has the bank
LI R3,DFDR R3 pointer to the list of AUs
BL @RNDOIT Let's rename a file!
* If it successfully renamed the file, we have to write
* the FDIR back out to disk.
CI R9,0
JEQ RENM20
CI R9,1
JEQ RENM15
LDCR @B02,4
MOV @RNFDIR,R7
LI R5,DFDR
LI R4,>0200 Bank of DFDR
**
*
* Here we write the FDIR or DDR back out to disk. At this
* point in the program, the following registers must be set.
*
* R4 = Bank # with the DDR or FDIR
* R5 = Pointer to the DDR or FDIR in memory
* R6 = SCSI ID of drive we're writing to
* R7 = AU of DDR or FDIR
*
**
RN11A LDCR @B04,4
MOV R6,R3
SRL R3,8
SLA R3,1
MPY @SAUTBL(R3),R7
LI R1,SECBUF
SRL R8,1
JNC RENM12
AI R1,>100
RENM12 SRL R7,1
JNC RENM13
ORI R8,>8000
RENM13 LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JNE RENM9A Error routine
LI R0,256 Copy the FDIR into the buffer
RENM14 LDCR R4,4
MOV *R5+,R2
LDCR @ZERO,4
MOV R2,*R1+
DECT R0
JNE RENM14
BLWP @BANKIT
DATA SCSIWT
JNE RENM9A
RENM15 LDCR @ZERO,4
MOVB @ZERO,@>8356
B @DSRRT
* If we get to here, then there is no filename with the same
* name as what we ant to rename. Check to see if there is a
* directory with the name and rename that
*
RENM20 BL @GETDDR
LDCR @B03,4
MOVB @23(R5),R1 Get number of subdirectories
JEQ RENM21
LI R2,>0300 R2 = bank of the DDR
MOV R5,R3
AI R3,28
BL @RNDOIT
CI R9,0
JNE RENM22
RENM21 LDCR @ZERO,4 File not found error
MOVB @B07,@>8350
B @DSRRT
RENM22 CI R9,1
JEQ RENM15
* We have to write the DDR back out to disk
*
BL @GETDDR Get pointer to DDR in R5
LI R4,>0300 Bank of DDR in memory
LDCR @B04,4
MOV @SAVEAU,R7
JMP RN11A
************************************************************
* *
* PROCEDURE: RNDOIT (REname DO IT) *
* *
* This procedure has been written so that it can rename *
* either a file or a directory. All it needs is a list *
* of AUs from either an FDIR or a DDR and will modify *
* the file name in the header of the FDR or DDR and *
* resequence the list of AUs. It it the duty of the *
* caller to write the list of AUs back out to disk. *
* *
* Inputs: *
* RNOLD - Contains the old name of the file or dir *
* RNNEW - Contains the new name of the file or dir *
* R1 - Number of AUs in the list (MSB) *
* R2 - Bank number of list (MSB) *
* R3 - Points to list of AUs *
* *
* Output: *
* R9 = 0 - File not found *
* 1 - File renamed, no need to write list di disk *
* 2 - File renames, write index back to disk *
* *
************************************************************
RNDOIT LDCR @B02,4
SRL R1,8
MOV R1,@RNHIGH
DEC R1
CLR R0
CLR @RNLOW
CLR @LONAM
SETO @HINAM
* Start by copying the old name to the file name compare
* buffer in bank 0
LI R4,10
LI R5,FNCB
LI R7,RNOLD
RNDO1 LDCR @B02,4
MOV *R7+,R8
LDCR @ZERO,4
MOV R8,*R5+
DECT R4
JNE RNDO1
RNDO2 MOV R0,R4 Compute the midpoint
A R1,R4
ANDI R4,>FFFE
A R3,R4
LDCR R2,4
MOV *R4,R7 Get AU
LDCR @B02,4
MOV R7,@RENMAU Save AU in case this is the one
LDCR @B04,4
MOV R6,R4
SRL R4,8
SLA R4,1
MPY @SAUTBL(R4),R7
LI R4,SECBUF
SRL R8,1
JNC RNDO3
AI R4,>100
RNDO3 SRL R7,1
JNC RNDO4
ORI R8,>8000
RNDO4 LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JEQ RNDO4A
MOVB @B06,@>8350 Device error
B @DSRRT
* Here we compare the name to the new filename. This will
* help narrow down the search for where the file will go
* after it has been renamed.
*
RNDO4A
LI R7,RNNEW
MOV R4,R8
LI R5,10
RNDO4B LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
C R9,*R7+
JH RNDO4D
JL RNDO4G
DECT R5
JNE RNDO4B
* This matched the new name. We have to set everything
*
MOV R0,R7 Recalculate midpoint
A R1,R7
SRL R7,1
MOV R7,@RNLOW
MOV R7,@RNHIGH
LI R7,LONAM
MOV R4,R8
LI R5,10
RNDO4C LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
MOV R9,@10(R7)
MOV R9,*R7+
DECT R5
JNE RNDO4C
JMP RNDO5
RNDO4D LI R7,HINAM
MOV R4,R8
LI R5,10
RNDO4E LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
C R9,*R7+
JH RNDO5
JL RNDO4F
DECT R5
JNE RNDO4E
* This name is higher than the new name, but lower
* than HINAM. We need to set the new HINAM and RNHIGH
*
RNDO4F LI R7,HINAM
MOV R4,R8
LI R5,10
RNDO4K LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
MOV R9,*R7+
DECT R5
JNE RNDO4K
MOV R0,R7 Recalculate midpoint
A R1,R7
SRL R7,1
MOV R7,@RNHIGH
JMP RNDO5
**
RNDO4G LI R7,LONAM
MOV R4,R8
LI R5,10
RNDO4H LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
C R9,*R7+
JH RNDO4I
JL RNDO5
DECT R5
JNE RNDO4H
* This name is lower than the new name, but higher
* than LONAM. We need to set the new LONAM and RNLOW
*
RNDO4I LI R7,LONAM
MOV R4,R8
LI R5,10
RNDO4J LDCR @ZERO,4
MOV *R8+,R9
LDCR @B02,4
MOV R9,*R7+
DECT R5
JNE RNDO4J
MOV R0,R7 Recalculate midpoint
A R1,R7
SRL R7,1
MOV R7,@RNLOW
* Compare the names to see if we have a match
*
RNDO5 LDCR @ZERO,4
LI R5,FNCB
RNDO5A C *R4+,*R5+
JL RNDO6
JH RNDO7
CI R5,FNCB+10
JNE RNDO5A
* We have a match !!!
AI R4,-10
* If this is an FDR, see if it is protected. If so, abort
* here. If it is not protected, or if this is a DDR,
* continue on.
MOV @28(R4),R1
CI R1,'FI'
JNE RNDO10
MOV @12(R4),R1
COC @PROBIT,R1
JNE RNDO10
MOVB @B01,@>8350 Set error - file protected
B @DSRRT
* The name didn't match. Adjust the bounds of our search
*
RNDO6 C R0,R1 Anything left to check
JEQ RNDO8
MOV R0,R4 Adjust lower bound of search
A R1,R4
SRL R4,1
MOV R4,R0
INC R0
B @RNDO2
RNDO7 C R0,R1
JEQ RNDO8
MOV R0,R4 Adjust upper bound of search
A R1,R4
SRL R4,1
C R4,R0
JEQ RNDO8
MOV R4,R1
DEC R1
B @RNDO2
* The name didn't exist - return to the caller
*
RNDO8 CLR R9
RT
* The filename existed and wasn't protected. Now we have to
* see if the name we want to rename it to already exists
*
RNDO10 LI R4,10 Copy the new name to the FNCB
LI R5,FNCB
LI R7,RNNEW
RNDO11 LDCR @B02,4
MOV *R7+,R8
LDCR @ZERO,4
MOV R8,*R5+
DECT R4
JNE RNDO11
LDCR @B02,4
MOV @RNLOW,R0 Get bounds of search
MOV @RNHIGH,R1
C R0,R1 If equal, new filename
JNE RND11A exists already
C @LONAM,@ZERO
JNE RN15A
RND11A
* Here are some check to see if we have to scan the
* directory again
* Check 1 - If the name we want to rename to comes before
* the first file in the directory, we can skip
* processing
CI R1,0
JEQ RNDO19
* Check 2 - If R0 and R1 are off by only 1, we know the new
* file will go between them.
DEC R1
C R1,R0
JNE RND11B
C @LONAM,@ZERO
JNE RNDO18
RND11B
C @LONAM,@ZERO
JEQ RNDO12
INC R0
RNDO12
MOV R0,R4 Calculate the midpoint
A R1,R4
ANDI R4,>FFFE
A R3,R4
LDCR R2,4
MOV *R4,R7 Get AU
LDCR @B04,4
MOV R6,R4
SRL R4,8
SLA R4,1
MPY @SAUTBL(R4),R7
LI R4,SECBUF
SRL R8,1
JNC RNDO13
AI R4,>100
RNDO13 SRL R7,1
JNC RNDO14
ORI R8,>8000
RNDO14 LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JNE RNDER6
* Compare the names to see if we have a match
*
RNDO15 LI R5,FNCB
RN15B C *R4+,*R5+
JL RNDO16
JH RNDO17
CI R5,FNCB+10
JNE RN15B
* The new name exists - error!!!
*
RN15A LDCR @ZERO,4
MOVB @B07,@>8350
B @DSRRT
RNDO16 C R0,R1 Is there anything left to check?
JEQ RNDO18
MOV R0,R4
A R1,R4
SRL R4,1
MOV R4,R0
INC R0
JMP RNDO12
RNDO17 C R0,R1 Is there anything left to check?
JEQ RNDO19
MOV R0,R4
A R1,R4
SRL R4,1
C R4,R0
JEQ RNDO19
MOV R4,R1
DEC R1
JMP RNDO12
**
*
* Here is where we go if there is an error doing
* I/O to the SCSI drive
*
**
RNDER6 MOVB @B06,@>8350
B @DSRRT
*******************
RNDO18 INC R0
RNDO19
* We now have the index where the file will go. Based on
* where it was, we wither have to move the pointers forward,
* backward, or not at all.
SLA R0,1
LI R1,-2
LDCR @B02,4
MOV @RENMAU,R7
LDCR R2,4
MOV R3,R5
RNDO20 INCT R1
C *R5+,R7
JNE RNDO20
A R3,R0
A R3,R1
LI R10,1
C R1,R0 See which way we move
JEQ RNDO24 No shuffling of list required!!
JH RNDO22
* OK, We have to move pointers
*
DECT R0
C R0,R1
JEQ RNDO24
RNDO21 MOV @2(R1),*R1
INCT R1
C R1,R0
JNE RNDO21
JMP RNDO23
* We have to move pointers the other way
RNDO22 MOV @-2(R1),*R1
DECT R1
C R1,R0
JNE RNDO22
RNDO23 MOV R7,*R1
LI R10,2
* Now lets overwrite the name in the FDR or DDR
*
RNDO24 LDCR @B04,4
MOV R6,R5
SRL R5,8
SLA R5,1
MPY @SAUTBL(R5),R7
LI R5,SECBUF
SRL R8,1
JNC RNDO25
AI R5,>100
RNDO25 SRL R7,1
JNC RNDO26
ORI R8,>8000
RNDO26 LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JNE RNDER6
* Now copy the filename over the old one
* Lucky for us, it's still in the FNCB
LI R4,10
LI R9,FNCB
RNDO27 MOV *R9+,*R5+
DECT R4
JNE RNDO27
* Now write it out back to disk
*
BLWP @BANKIT
DATA SCSIWT
JNE RNDER6
* We are done - Success!!
MOV R10,R9
RT